/*
 * gdt.h
 * 
 * Global Descriptor Table
 * 
 */

#include <gdt.h>

/* Global Descriptor Table */

uint_64 gdt_table[] __attribute__((aligned(8))) =
{
	/* Offset 0x00 - Descriptor Nulo */
	
	GDT_NULL,
	
	/* Offset 0x08 - Descriptor Codigo Kernel */	
	
	GDT_DESC_BASE(0x0) | GDT_DESC_LIMIT(0xFFFFF) | GDT_DESC_DPL(0x0) | 
		GDT_DESC_S | GDT_DESC_P | GDT_DESC_DB | GDT_DESC_G | GDT_DESC_TYPE(GDT_TYPE_CODE_R),
	
	/* Offset 0x10 - Descriptor Datos Kernel */
	
    GDT_DESC_BASE(0x0) | GDT_DESC_LIMIT(0xFFFFF) | GDT_DESC_DPL(0x0) | 
		GDT_DESC_S | GDT_DESC_P | GDT_DESC_DB | GDT_DESC_G | GDT_DESC_TYPE(GDT_TYPE_DATA_W),
    
    /* Offset 0x18 - Descriptor Codigo Usuario */
    
    GDT_DESC_BASE(0x0) | GDT_DESC_LIMIT(0xFFFFF) | GDT_DESC_DPL(0x3) | 
		GDT_DESC_S | GDT_DESC_P | GDT_DESC_DB | GDT_DESC_G | GDT_DESC_TYPE(GDT_TYPE_CODE_R),

	/* Offset 0x20 - Descriptor Datos Usuario */

    GDT_DESC_BASE(0x0) | GDT_DESC_LIMIT(0xFFFFF) | GDT_DESC_DPL(0x3) | 
		GDT_DESC_S | GDT_DESC_P | GDT_DESC_DB | GDT_DESC_G | GDT_DESC_TYPE(GDT_TYPE_DATA_W),

	/* Offset 0x28 - Reservado para descriptor de TSS */

    GDT_NULL,    
};

gdt_reg gdtr = {(uint_16) (sizeof(gdt_table) - 1), (uint_32) &gdt_table};
